我正在开发一个项目,我有多个reposetories从不同的表中获取数据.我的所有存储库都是独立的,它们创建新的dataContext,向表中添加行并应用提交更改命令.现在,如果在我的服务中,有一种情况我必须将数据插入到多个表中,但它应该在一个事务中发生.我可以使用TrnasctionScope的东西实现这一点,但那需要相同的dataContext.当我使用StrucutreMap创建我的对象时,我无法获得相同的数据上下文,因此我的事务失败了.
这是我的对象是如何.
interface IConnection
{
MyDataContext GetContext();
}
public class Connection : IConnection
{
public MyDataContext GetContext()
{
return new MyDataContext();
}
}
interface IRepositryA
{
int SaveDataA(objectA a);
}
public class RepositoryA : IRepositryA
{
public int SaveDataA(objectA a)
{
var context = objectFactory.GetInstance<IConnection>().GetContext();
context.TableA.InsertOnSubmit(a);
context.SubmitChanges();
return a.ID;
}
}
interface IRepositryB
{
int SaveDataA(objectB b);
}
public class RepositoryA : IRepositryB
{
public int SaveDataB(objectB b)
{
var context = objectFactory.GetInstance<IConnection>().GetContext();
context.TableB.InsertOnSubmit(b);
context.SubmitChanges();
return b.ID;
}
}
Run Code Online (Sandbox Code Playgroud)
现在在我的服务层中,我将它们称为 …
我在将C#Linq语句转换为VB.NET时遇到了麻烦.我需要转换以下语句.我在i.Sum(v => v)部分被挂断了.
from p in Products
from u in Users
let i = (from op in OrderProducts
where op.Order.User == u && op.Product == p
select op.ProductQty)
let quant = i.Count() == 0 ? 0 : i.Sum(v=>v)
select new {p.ProductName, u.UserName, Quantity = quant}
Run Code Online (Sandbox Code Playgroud)
这是我对VB的看法,但If(i.Count()= 0,0,i.Sum())_语句表示在运行时期间不支持无参数聚合运算符'Sum'(没有编译时错误).我也尝试了i.Sum(函数(q)i.ProductQty),它也不起作用(表示不能用这些参数调用sum).
From p In Products _
From u In Users _
Let i = (From op In OrderProducts _
Where op.Order.User.UserID = u.UserID And op.Product.ProductID = p.ProductID _
Select op.ProductQty) _
Let Qty = …Run Code Online (Sandbox Code Playgroud) 我对Linq很新,我可以在任何地方找到多行数据读取示例(通过使用foreach()),但是读取单行数据的正确方法是什么?像经典的产品详细信息页面.
以下是我的尝试:
var q = from c in db.Products
where c.ProductId == ProductId
select new { c.ProductName, c.ProductDescription, c.ProductPrice, c.ProductDate };
string strProductName = q.First().ProductName.ToString();
string strProductDescription = q.First().ProductDescription.ToString();
string strProductPrice = q.First().ProductPrice.ToString();
string strProductDate = q.First().ProductDate.ToString();
Run Code Online (Sandbox Code Playgroud)
代码看起来不错,但是当我看到使用SQL Profiler生成的实际SQL表达式时,它让我很害怕!程序执行了四个Sql表达式,它们完全相同!
因为我从一行读了四列.我想我一定做错了,所以我想知道这样做的正确方法是什么?
谢谢!
如何改进此用户名/密码检查?
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Login(FormCollection collection)
{
var users =
(from p in _dataContext.Users
where p.Name == collection["Username"] && p.Password == collection["Password"]
select p);
if (users.Count() > 0)
{
// Login Succeed
// To get the username I should do something like users.First().Name
// and that's really bad...
return RedirectToAction("Login");
}
else
{
// Login Faild
return View();
}
}
Run Code Online (Sandbox Code Playgroud) LINQ的新功能.我很好奇在LINQ中执行以下SQL查询的语法
SELECT MAX(TMPS), DAY FROM WEATHERREADINGS
GROUP BY WEATHERREADINGS.DAY
Run Code Online (Sandbox Code Playgroud)
到目前为止我所拥有的:
var minTemps = from ps in ww.WEATHERREADINGS
group ps by ps.DATE.Hour into psByHour
select new
{
HourOfDay = psByHour.Max().DATE.Hour,
MaxTemp = psByHour.Max().TMPS
};
Run Code Online (Sandbox Code Playgroud)
这样做时我收到以下错误:
异常详细信息:System.InvalidOperationException:无法将节点"New"格式化为SQL执行.
任何帮助非常感谢!!
我的查询是:
var ReadAndUnreadMessages =
(from m in MDB.Messages
orderby m.Date descending
where m.ID_Receive == (Guid)USER.ProviderUserKey && m.Delete_Admin == false
select new AllMessages()
{
id = (LoadMessageChildren(m.ID_Message)[LoadMessageChildren(m.ID_Message).Count - 1] as Message).ID_Message,
parent = (Guid)(LoadMessageChildren(m.ID_Message)[LoadMessageChildren(m.ID_Message).Count - 1] as Message).ID_Message_Parent,
sender = (LoadMessageChildren(m.ID_Message)[LoadMessageChildren(m.ID_Message).Count - 1] as Message).ID_Sender,
receiver = (Guid)USER.ProviderUserKey,
subject = (LoadMessageChildren(m.ID_Message)[LoadMessageChildren(m.ID_Message).Count - 1] as Message).Subject.Subject1.ToString() == "Other" ?
(LoadMessageChildren(m.ID_Message)[LoadMessageChildren(m.ID_Message).Count - 1] as Message).Other_Subject
:
(LoadMessageChildren(m.ID_Message)[LoadMessageChildren(m.ID_Message).Count - 1] as Message).Subject.Subject1.ToString(),
body = (LoadMessageChildren(m.ID_Message)[LoadMessageChildren(m.ID_Message).Count - 1] as Message).Body.Length > 26 ?
(LoadMessageChildren(m.ID_Message)[LoadMessageChildren(m.ID_Message).Count - …Run Code Online (Sandbox Code Playgroud) 我想学习ORM,我想知道哪个对于启动是有益的; Linq to SQL或Nhibernate.考虑时间,适应......等等
var temp = (from assetVisit in db.AssetVisits
join assetBundle in db.AssetBundles on assetVisit.AssetID equals assetBundle.AssetID
join groupBundle in db.GroupBundles on assetBundle.BundleID equals groupBundle.BundleID
join userGroup in db.UserGroups on groupBundle.GroupID equals userGroup.GroupID
where assetVisit.CompanyID == companyID &&
userGroup.UserID == userID
select new { AssetID = assetVisit.AssetID, Count = assetVisit.AccessCounter }).Distinct();
IQueryable<Asset> final = (from t in temp
join asset in db.Assets on t.AssetID equals asset.AssetID
where asset.IsActive == true
&& asset.AssetTypeID == assetType
&& asset.ShowInResults == true
&& (asset.CompanyID == companyID …Run Code Online (Sandbox Code Playgroud) 如何查询使用select new?填充/创建的集合?
我有这个BindingSource:
this.bindingSource.DataSource =
from row in db.Table
select new
{
name = row.Name + row.Num.ToString()
};
Run Code Online (Sandbox Code Playgroud)
我想像查询其他BindingSources一样查询它:
var query = from row in (IEnumerable<Table>)anotherBindingSource.List
where row.name == "asd"
select row;
Run Code Online (Sandbox Code Playgroud)
由于bindingSource包含匿名类型,我收到此错误:
无法将类型为'System.Data.Linq.SortableBindingList
1[<>f__AnonymousType815 等的对象强制转换为'System.Collections.Generic.IEnumerable`1 [Table]'.
我该怎么办?
我如何获得产品列表,例如,他们的productName以数字开头?
谢谢!!
linq-to-sql ×10
linq ×6
c# ×3
asp.net ×1
c#-3.0 ×1
database ×1
exception ×1
nhibernate ×1
orm ×1
vb.net ×1