0

我有一个查询,我通过它填充网格。这是查询,

var query = from r in DbContext.Groups
           select 
             new 
               {
                 r.Id, r.Name, r.Description, r.UpdatedBy, r.UpdatedDate, 
                 GroupType =DbContext.ProductTypes.Where(p=>p.Id ==  
                                           r.ProductTypes_Id).Select(t=>t.Name)
               };

所以,问题是从另一个表中提取的 grouptype 的值没有显示该值。它正在显示类型(System.Common ....)。你能帮我解决这个问题吗?

4

5 回答 5

1

也许试试

GroupType =DbContext.ProductTypes.Where(p=>p.Id == r.ProductTypes_Id).Select(t=>new { name = t.Name})

或者

GroupType =DbContext.ProductTypes.Where(p=>p.Id == r.ProductTypes_Id).FirstOrDefault().Name

于 2012-05-25T03:36:26.950 回答
0

您正在选择序列而不是项目。如果您知道您只会返回一个值,请使用.Single运算符:

 GroupType =DbContext.ProductTypes.Where(p=>p.Id ==  
                           r.ProductTypes_Id).Select(t=>t.Name).Single()

.Single()注意末尾 的附加。

(它显示类型名称的原因是因为它只是显示了操作符实现类的默认.ToString()方法。).Select

于 2012-05-25T03:34:41.363 回答
0

你期待吗

DbContext.ProductTypes.Where(p=>p.Id == r.ProductTypes_Id).Select(t=>t.Name)

返回单个值?现在看起来它正在分配一个 linq 匿名类型列表,而不是单个值。

如果您需要单个值,请使用 First,如果您可以保证(或不保证)返回的值,请使用 FirstOrDefault。

于 2012-05-25T03:35:47.670 回答
0

的结果

.Select(t=>t.Name)

是一个

IEnumerable<ProductType>

所以你有一个集合而不是单个值。

例如,将您的查询更改为:

var query = from r in DbContext.Groups
       select 
         new 
           {
             r.Id, r.Name, r.Description, r.UpdatedBy, r.UpdatedDate, 
             GroupType =DbContext.ProductTypes.Single(p=>p.Id ==  
                                       r.ProductTypes_Id).Name
           };

但是,此代码包含危险的东西,我建议添加额外的检查(例如,如果找不到产品类型,此代码将引发异常等),理想情况下,将此代码移动到存储库或类似的东西.

于 2012-05-25T03:36:12.800 回答
0

为什么不使用简单的连接操作

from r in DbContext.Groups join p in DbContext.ProductTypes on r.ProductTypes_Id equals p.Id
select new { Id = r.Id, Name = r.Name, Description = r.Description, UpdatedBy = r.UpdatedBy, UpdatedDate = r.UpdatedDate, GroupType = p.Name };
于 2012-05-25T03:59:44.897 回答