如何连接两个表,并使用Linq检索项集合

时间:2012-11-30 16:29:20

标签: c# sql linq

我有两个表:baswareCatalog.FlowCurrent和baswareCatalog.Doc。 它们都包含属性DocId。 Doc-table还具有LastExpireDate和Status属性。 FlowCurrent-table还具有RecipientName属性。 我想要检索Doc的集合,其中两个表中的项目的DocId是相同的。

此外,此条件必须为true:flowCurrent.RecipientName.Contains(userFullName)

我尝试了以下内容,但我不知道它是否正确。

var docitemIQueryable = from flowCurrent in baswareCatalog.FlowCurrent join 
                        document in baswareCatalog.Docs on 
                        flowCurrent.DocId equals document.DocId 
                        where flowCurrent.RecipientName.Contains(userFullName) 
                        select new
                        {
                          Items = baswareCatalog
                                  .Docs
                                  .Where(b => b.DocId == flowCurrent.DocId)
                        };

返回值是

'interface System.Linq.IQueryable<out T>'.
T is 'a' 
Anonymous Types: 'a is new {IQueryable<Doc> Items }'

如何检索可以迭代的Doc集合?

3 个答案:

答案 0 :(得分:1)

如果不了解您的表结构,您的查询看起来还不错。选择&#39;选择&#39;你有两个表加入并受where子句限制。

在select new中,您可以为新对象分配要包含的原始表中的任何属性。

select new
{
    DocId = flowCurrent.DocId,
    LastExpireDate = document.LastExpireDate,
    //etc
}

如果您只想获取doc项目,可以执行此操作

var docitemIQueryable = from flowCurrent in baswareCatalog.FlowCurrent join 
                    document in baswareCatalog.Docs on 
                    flowCurrent.DocId equals document.DocId 
                    where flowCurrent.RecipientName.Contains(userFullName) 
                    select document;

然后你会有一个可疑的文件

答案 1 :(得分:1)

两件事:

  1. System.Linq.IQueryable是一个可以迭代的集合。您可以将其放在foreach循环中,也可以随意使用它。或者,如果您想立即实现它,可以使用.ToList()
  2. 您正在进行额外的工作,而不需要在查询中执行此操作。您正在FlowCurrentDocs之间进行联接,但之后您将获得结果并再次返回Docs。你不需要这样做。
  3. 假设您关心的只是Docs中的内容,请尝试以下方法:

    var docitemIQueryable = from flowCurrent in baswareCatalog.FlowCurrent 
                            join document in baswareCatalog.Docs on 
                                flowCurrent.DocId equals document.DocId 
                            where flowCurrent.RecipientName.Contains(userFullName) 
                            select document;
    

    这将为您提供包含Docs中所有字段的行集合。如果您需要FlowCurrent中的某些内容,那么您需要做更多类似的事情:

    var docitemIQueryable = from flowCurrent in baswareCatalog.FlowCurrent 
                            join document in baswareCatalog.Docs on 
                                flowCurrent.DocId equals document.DocId 
                            where flowCurrent.RecipientName.Contains(userFullName) 
                            select new {
                                document.DocId, flowCurrent.blahblah, ...
                            };
    

答案 2 :(得分:0)

结果是items属性中的一系列对象,因此您需要嵌套循环或SelectMany

foreach(var item in docitemIQueryable.SelectMany( x=> x.Items)){
   //do something
}

然而,似乎你的内部选择只返回一个元素,在这种情况下你可以跳过匿名类型对象,只需选择如下所示

select document;

并简化循环到

foreach(var item in docitemIQueryable){
   //do something
}