我有以下查询,使用Simple.Data.SqlServer.中的Join语句从数据库中读取记录
var productLineItem = (ProductLineItem) (database.Products.All()
.Select(
database.Products.Name,
database.Products.Price
)
.Join(database.BarCodes)
.On(database.BarCodes.ProductID == database.Products.ID)
.Where(database.BarCodes.BarCode == barCode).FirstOrDefault())
请注意,我必须使用FirstOrDefault方法,并将整个语句包装到括号中,然后将其强制转换为对象。我不喜欢这种方式。我认为很简单。数据应该能够像下面的代码一样工作
ProductLineItemproductLineItem = database.Products.Get()
.Select(
database.Products.Name,
database.Products.Price
)
.Join(database.BarCodes)
.On(database.BarCodes.ProductID == database.Products.ID)
.Where(database.BarCodes.BarCode == barCode);
在上面的例子中,我使用Get是因为我知道我只会得到一条记录,而不是一个记录列表,但这个查询不起作用。
如何在不使用那些难看的方法的情况下,使用简单的、渴望数据的加载查询来实现我想要的?
我不确定你理想中想要的是否可能,但有一种Cast()
Linq方法,你可以使用它至少以函数风格继续查询,并删除你不喜欢的括号:
var productLineItem = database.Products
.All()
.Select(database.Products.Name, database.Products.Price)
.Join(database.BarCodes)
.On(database.BarCodes.ProductID == database.Products.ID)
.Where(database.BarCodes.BarCode == barCode)
.Cast<ProductLineItem>()
.FirstOrDefault();
不确定我是否得到了正确的Q。。。但是Get返回序列的一个元素,所以不能在那里Select
。。。另一方面:
var database = Database.OpenNamedConnection("MyDbCnxString");
var x= 11;
var y= 1;
var result= database.Table1.FindAllByX(x)
.Select(
database.Table1.X,
database.Table1.Y
)
.Join(database.Table2)
.On(database.Table2.X== database.Table1.X)
.Where(database.Table2.Y== y);
(result as object).Dump("Voila!");
这个LinqPad代码似乎工作正常。
不知道你用丑陋的方法是什么意思,它在我看来很漂亮:)
关于演员阵容(如果这是你不喜欢的第一个查询),
IEnumerable<IResult> results = (result as SimpleQuery).ActLike<IEnumerable<IResult>>();
//DuckTypeTest
foreach(var r in results)
Console.WriteLine("IResult {0}:{1}",r.ClientId,r.ClientSeqNo);
更详细,但至少远离查询
其中IResult
public interface IResult {
object X {get;set;}
object Y {get;set;}
}
其中ActLike<IResult>
using ImpromptuInterface;
来自GitHub:ImpromptuInterface
您仍然需要手动创建和维护您的POCO ProcuctLineItem,并且您知道某个地方将不得不生成一些SQL,这可能是最优的,也可能不是最优的。使用真正的SQL,然后让QueryFirst生成ADO,你会不会更快乐、更放松?