正确构造此LinqToSql代码

时间:2012-05-17 16:31:05

标签: asp.net linq-to-sql c#-4.0

通常情况下,我在SQL中使用存储过程/工作,如果我在这里略微提到术语,请道歉。

我有一个数据库,有3个单独的表,我需要搜索3个表中的每个表中的多个字段。

我确信我不是这样做的有效方式,最初我试图用简单的步骤来理解它。

我有以下内容;

    var foo1 = entities.table1.Where(a => a.bodyText.Contains(searchString) || a.pageTitle.Contains(searchString));
    var foo2 = entities.table2.Where(b => b.newsArticle.Contains(searchString) || b.newsArticle.Contains(searchString));
    var foo3 = entities.table3.Where(c => c.ImageDescriptionContains(searchString));

我需要将所有这些结果合并到一个转发器中进行显示。

此时,所有3组数据都是独立的,独特的匿名数据集合。那么最好的方法是将它们转换成一个连贯的可绑定源吗?

我正在考虑依次遍历每个列表,拉出我需要显示的字段并将它们放在一个新类中,然后将这些类的lsit绑定到转发器。

但这对我来说似乎有点笨拙。

有没有办法一次性遍历所有3个表,并从每个表中返回我需要的字段,并使用通用名称(即在SQL中我可以写

    select b.newsArticle as myText, 

    select newsArticle, '' 

返回新闻文章和空字符串。)

2 个答案:

答案 0 :(得分:1)

这将结合起来:

var foos = foo1.ToList();
foos.AddRange(foo2);
foos.AddRange(foo3);

获得你想要的东西:

var myExtractedValues = foos.Select(x => new { 
         Article = !string.IsNullOrEmpty(x.newsArticle)) 
                           ? x.newsArticle 
                           : string.Empty});

我在这里使用了匿名类型,但你可以用你自己的类型交换新的{}。

我在IsNullOrEmpty上反转操作符,但这只是个人偏好(我更喜欢读取方式。)

答案 1 :(得分:1)

要一次性获得所有结果,您需要定义一个公共类,所有三个查询都将使用该类来存储结果。这个类可能也是匿名的,但为了清楚起见,我将其命名。

class Data
{
    public string Text{ get; set;}
}

现在,在您的代码中,您将从数据库中获取Data的实例,并且可以使用Union

using( var entities = new YourDataContext)
{
    var foo1 = entities.table1
                       .Where(a => a.bodyText.Contains(searchString) || 
                                   a.pageTitle.Contains(searchString))
                       .Select(a => new Data{ Text = a.bodyText});
    var foo2 = entities.table2
                       .Where(b => b.newsArticle.Contains(searchString) || 
                                   b.newsArticle.Contains(searchString))
                       .Select(b => new Data{ Text = b.newsArticle});
    var foo3 = entities.table3
                       .Where(c => c.ImageDescription.Contains(searchString))
                       .Select(c => new Data{ Text = c.ImageDescription});
    return foo1.Union(foo2).Union(foo3);
}