通常情况下,我在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, ''
返回新闻文章和空字符串。)
答案 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);
}