0

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

此外,此条件必须为真: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 集合?

4

3 回答 3

1

如果不了解您的表结构,您的查询看起来还不错。在“选择”点,您将两个表连接起来并受 where 子句的限制。

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

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

如果您只想获取文档项目,您可以这样做

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;

然后你将有一个可查询的文档

于 2012-11-30T16:37:55.500 回答
1

两件事情:

  1. System.Linq.IQueryable是一个可以迭代的集合。你可以把它放在一个foreach循环中,或者用它做任何你想做的事情。或者,.ToList()如果您想立即实现它,您可以使用它。
  2. 您正在做不需要在查询中做的额外工作。您正在 and 之间进行连接FlowCurrentDocs但随后您正在获取结果并Docs再次返回。你不需要这样做。

假设你关心的只是 中的东西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, ...
                        };
于 2012-11-30T16:40:12.043 回答
0

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

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

但是,您的内部选择似乎只返回一个元素,在这种情况下,您可以跳过匿名类型对象并简单地选择如下

select document;

并将循环简化为

foreach(var item in docitemIQueryable){
   //do something
}
于 2012-11-30T16:41:46.587 回答