Hi im trying to replicate this mysql query
SELECT a.id, a.title, a.description, a.categories_id, c.name, d.title
FROM ads AS a
INNER JOIN locations AS b
ON a.locations_id = b.id
INNER JOIN areas AS c
ON b.areas_id = c.id
INNER JOIN categories AS d
ON a.categories_id = d.id
WHERE a.title LIKE '%mini%'
AND c.name = 'Fyn'
LIMIT 10
and here is it in LINQ
var query = (from a in db.ads
join b in db.locations on a.locations_id equals b.id
join c in db.areas on b.id equals c.id
join d in db.categories on a.categories_id equals d.id
where a.title.Contains(searchQuery) && c.name.Equals(area)
select new {
a.id,
a.title,
a.description,
category = d.title
}).Take(10);
it doesn't show any error but it's not returning any data.
You have mistake in third line:
join c in db.areas on b.id equals c.id
should be
join c in db.areas on b.areas_id equals c.id
Related
I want to change this SQL query to Entity Framework query:
SELECT
dbo.ClassTiming.StartTime,
dbo.ClassTiming.EndTime,
dbo.Employee.StaffName,
dbo.Department.DepartmentName,
dbo.Class.ClassName,
dbo.Section.SectionName,
dbo.WeekDay.DayName
FROM dbo.Timetable
INNER JOIN dbo.ClassTiming
ON dbo.Timetable.ClassTimingId = dbo.ClassTiming.Id
INNER JOIN dbo.Employee
ON dbo.Timetable.StaffId = dbo.Employee.StaffID
INNER JOIN dbo.Department
ON dbo.Timetable.DepartmentId = dbo.Department.id
INNER JOIN dbo.Section
ON dbo.Timetable.SectionID = dbo.Section.ID
INNER JOIN dbo.Class
ON dbo.Timetable.ClassID = dbo.Class.ID
INNER JOIN dbo.WeekDay
ON dbo.Timetable.WeekDayId = dbo.WeekDay.Id
This should work
var db = new YourDbContext();
var result = (from t in db.Timetables
join c in db.ClassTimings on t.ClassTimingId equals c.Id
join e in db.Employees on t.StaffId equals e.StaffID
join d in db.Departments on t.DepartmentId equals d.Id
join s in db.Sections on t.SectionID equals s.Id
join cl in db.Classes on t.ClassID equals cl.Id
join w in db.WeekDays on t.WeekDayId equals w.Id
select
new { c.StartTime,
c.EndTime, e.StaffName,
d.DepartmentName,
cl.ClassName,
s.SectionName,
w.DayName
}
).ToList();
I have a SQL Query that gets Distinct rows of Vendor Contacts, which is returning the proper number of rows:
SELECT DISTINCT v.VendorID, c.ContactID,
v.VendorName,
c.FirstName, c.MiddleName, c.LastName,
FROM VendorContacts vc
INNER JOIN Contact c
ON c.ContactID = vc.ContactID
INNER JOIN Vendor v
ON v.VendorID = vc.VendorID
LEFT JOIN [ContactServices] psvc
ON psvc.ContactID = c.ContactID
AND psvc.VendorID = v.VendorID
I have a method that I want to return of custom type, based on the above query:
public List<ProviderContactInfo> GetProviderContactInfo(ProviderContactInfo searchInfo)
{
using (var db = new MyContext())
{
var providerContactInfo =
(from vc in db.VendorContacts
join ps in db.ContactServices on new { vc.ContactID, vc.VendorID } equals new { ps.ContactID, ps.VendorID } into ps_join
from ps in ps_join.DefaultIfEmpty()
join c in db.Contacts on vc.ContactID equals c.ContactID
join v in db.Vendors on vc.VendorID equals v.VendorID
orderby vc.ContactID descending
select new ProviderContactInfo()
{
VendorName = v.VendorName,
FirstName = c.FirstName,
MiddleName = c.MiddleName,
LastName = c.LastName,
Services = (from o in db.ContactServices
join cps in db.Contacts on o.ContactID equals cps.ContactID
join vps in db.Vendors on o.VendorID equals vps.VendorID
join s in db.Services on o.ServiceID equals s.ServiceID
where ps.ServiceID == o.ServiceID
&& o.ContactID == c.ContactID
&& o.VendorID == v.VendorID
select s).ToList()
}).Distinct().ToList();
return providerContactInfo;
}
}
I'm getting the error:
Additional information: The 'Distinct' operation cannot be applied to
the collection ResultType of the specified argument.
Everything works fine when I remove the Services property from the new ProviderContactInfo so I'm sure it's in the way I'm trying to populate that property (which is of type List<Service>)
I know there are a lot of questions regarding Linq with Distinct etc but I couldn't find anything on this specific problem.
Please help!
EDIT This code works:
public List<ProviderContactInfo> GetProviderContactInfo(ProviderContactInfo searchInfo)
{
using (var db = new MyContext())
{
var providerContactInfo =
(from vc in db.VendorContacts
join c in db.Contacts on vc.ContactID equals c.ContactID
join v in db.Vendors on vc.VendorID equals v.VendorID
orderby vc.ContactID descending
select new ProviderContactInfo()
{
VendorName = v.VendorName,
FirstName = c.FirstName,
MiddleName = c.MiddleName,
LastName = c.LastName,
Services = (from o in db.ContactServices
join cps in db.Contacts on o.ContactID equals cps.ContactID
join vps in db.Vendors on o.VendorID equals vps.VendorID
join s in db.Services on o.ServiceID equals s.ServiceID
where o.ContactID == c.ContactID
&& o.VendorID == v.VendorID
select s).ToList()
}).Distinct().ToList();
return providerContactInfo;
}
}
You should add one more step to the process, to avoid applying Distinct() on the objects that have a collection (Services) property, the LINQ provider does not know how to handle it.
var providerContactInfo = from vc in db.VendorContacts
join ps in db.ContactServices on new { vc.ContactID, vc.VendorID } equals new { ps.ContactID, ps.VendorID } into ps_join
from ps in ps_join.DefaultIfEmpty()
join c in db.Contacts on vc.ContactID equals c.ContactID
join v in db.Vendors on vc.VendorID equals v.VendorID
orderby vc.ContactID descending
group ps by new
{
v.VendorName,
c.FirstName,
c.MiddleName,
c.LastName,
c.ContactID,
v.VendorID
} into g
select new ProviderContactInfo()
{
VendorName = g.Key.VendorName,
FirstName = g.Key.FirstName,
MiddleName = g.Key.MiddleName,
LastName = g.Key.LastName,
Services = (from e in g
from o in db.ContactServices
join cps in db.Contacts on o.ContactID equals cps.ContactID
join vps in db.Vendors on o.VendorID equals vps.VendorID
join s in db.Services on o.ServiceID equals s.ServiceID
where e.ServiceID == o.ServiceID
&& o.ContactID == g.Key.ContactID
&& o.VendorID == g.Key.VendorID
select s).ToList()
}
Wouldn't this be much simplier:
public IQueryable<VendorContact> GetProviderContactInfo(ProviderContactInfo searchInfo)
{
using (var db = new MyContext())
{
return providerContactInfo=db.VendorContacts
.Include(vc=>vc.Contacts)
.Include(vc=>vc.Services)
.Include(vc=>vc.Vendor)
.OrderByDescending(vc=>vc.ContactID);
}
}
I'm working with the following linq query:
var docList = from c in container.DocumentDeliveryPreferences
join o in container.Documents on c.DocumentId equals o.DocumentId
select new { o.Name, o.DocumentType, c.CustomerId };
How can I modify this to select only Documents where c.CustomerId equals X(some paramenter)?
You could try something the following:
var docList = from c in container.DocumentDeliveryPreferences
join o in container.Documents
on c.DocumentId equals o.DocumentId
where c.CustomerId == X
select new { o.Name, o.DocumentType, c.CustomerId };
where X is your parameter.
I have written the below given query in SQL server 2008:
(SELECT p.postid,
p.title,
p.disabled,
l.locationname
FROM posts p
INNER JOIN categories c
ON p.categoryid = c.categoryid
INNER JOIN users u
ON p.userid = u.userid
INNER JOIN tags t
ON p.tagid = t.tagid
INNER JOIN locations l
ON p.locationid = l.locationid
LEFT JOIN postimages pm
ON p.postid = pm.postid
WHERE p.categoryid = 1
GROUP BY p.postid,
p.title,
p.disabled,
l.locationname)
ORDER BY p.postid DESC
I want to write the above query in LINQ.
I tried a little and able to write the query below:
var objPosts = (from p in _dbcontext.Posts
join us in _dbcontext.Users on p.UserId equals us.UserId
join tag in _dbcontext.Tags on p.TagId equals tag.TagId
join cat in _dbcontext.Categories on p.CategoryId equals cat.CategoryId
join loc in _dbcontext.Locations on p.LocationId equals loc.LocationId
join img in _dbcontext.PostImages on p.PostId equals img.PostId into gj
from postimg in gj.DefaultIfEmpty()
where p.Disabled == false && p.CategoryId == userPost.CategoryId || p.UserId == userPost.UserId || p.TagId == userPost.TagId || p.LocationId == userPost.LocationId
orderby p.PostId descending
select new
{
PostId = p.PostId,
PostTitle = p.Title,
//ImageInfo = postimg.ImagePath,
//ThumbNailInfo = p.ThubNailInfo,
PostShortDescription = p.ShortDescription,
UserId = us.UserId,
UserName = us.Name,
TagId = tag.TagId,
TagTitle = tag.Title,
CategoryId = cat.CategoryId,
CategoryName = cat.CategoryName,
LocationId = loc.LocationId,
LocationName = loc.LocationName
});
I am unable to apply the group by logic in LINQ. Can anyone please convert my SQL to LINQ. Thanks
group new { p, l } by new
{
p.postid,
p.title,
p.disabled,
l.locationname
} into g
orderby g.Key.PostId descending
select new
{
g.key.postid,
g.key.title,
g.key.disabled,
g.key.locationname
}
The missing part in your query is that you are not selecting anything...
You got the joins ok, left outer join ok, predicates (where), ordering, but no projection, and no group by.
Below should get you started:
group p by p.PostId into pg
select new {Post=p, Location=loc};
This would return return a collection of new objects whose properties Post and Location.
i have a query like this
WITH CTE_KELOMPOKINFORMASI (KelompokInformasi, XBRLItem_ItemId)
AS (
SELECT a.Id AS KelompokInformasi, c.XBRLItem_ItemId
FROM XBRLNamespaces a INNER JOIN XBRLHypercubes b
ON a.XBRLView_ViewId = b.XBRLView_ViewId
INNER JOIN XBRLHypercubeDimensionItems c
ON b.XBRLHypercubeId = c.XBRLHypercube_XBRLHypercubeId
WHERE a.Id like '%KBIK_AAKL%')
SELECT f.KelompokInformasi, e.Name AS DimensionName, c.Id AS Domain,
d.Text AS Description FROM [dbo].[XBRLDefinitionRoleDomainItems] a
INNER JOIN [dbo].[XBRLDefinitionRoleDimensionItems] b
ON a.XBRLDefinitionRole_DefinitionRoleId = b.XBRLDefinitionRole_DefinitionRoleId
INNER JOIN XBRLItems c ON a.XBRLItem_ItemId = c.ItemId
INNER JOIN XBRLLabels d
ON a.XBRLItem_ItemId = d.XBRLItem_ItemId
INNER JOIN XBRLItems e
ON b.XBRLItem_ItemId=e.ItemId
INNER JOIN CTE_KELOMPOKINFORMASI f
ON b.XBRLItem_ItemId=f.XBRLItem_ItemId
WHERE b.XBRLItem_ItemId=f.XBRLItem_ItemId
i want to move this sql query to linq, i realized that CTE is impossible in LINQ. So i divide into 2 parts. First i create a var like this:
var KelompokInformasi = from x in ent.XBRLNamespaces
join y in ent.XBRLHypercubes on x.XBRLView_ViewId equals y.XBRLView_ViewId
join z in ent.XBRLHypercubeDimensionItems on y.XBRLHypercubeId equals z.XBRLHypercube_XBRLHypercubeId
where x.Id.Contains("KBIK")
select new
{
x.Id,
y.XBRLItem_ItemId
};
and in second part i create:
_list = (from a in ent.XBRLDefinitionRoleDomainItems
join b in ent.XBRLDefinitionRoleDimensionItems on a.XBRLDefinitionRole_DefinitionRoleId equals b.XBRLDefinitionRole_DefinitionRoleId
join c in ent.XBRLItems on a.XBRLItem_ItemId equals c.ItemId
join d in ent.XBRLLabels on a.XBRLItem_ItemId equals d.XBRLItem_ItemId
join e in ent.XBRLItems on b.XBRLItem_ItemId equals e.ItemId
join f in KelompokInformasi on b.XBRLItem_ItemId equals (int)f.XBRLItem_ItemId
where (b.XBRLItem_ItemId == (int)f.XBRLItem_ItemId)
select new MappingDomainRepository
{
KI = f.Id,
Dimension = e.Name,
Domain = c.Id,
Description = d.Text
}).ToList();
Where _list is from List<MappingDomainRepository> _list = new List<MappingDomainRepository>();
in my code above, i want to join my _list to var KelompokInformasi. In var kelompokInformasi I've got 47 rows but in _list I've got 0 data return.
What's wrong in my code? is it possible to join my _list to var kelompokInformasi?
You need to change the second part to:
var other = (from a in ent.XBRLDefinitionRoleDomainItems
join b in ent.XBRLDefinitionRoleDimensionItems on a.XBRLDefinitionRole_DefinitionRoleId equals b.XBRLDefinitionRole_DefinitionRoleId
join c in ent.XBRLItems on a.XBRLItem_ItemId equals c.ItemId
join d in ent.XBRLLabels on a.XBRLItem_ItemId equals d.XBRLItem_ItemId
join e in ent.XBRLItems on b.XBRLItem_ItemId equals e.ItemId
join f in KelompokInformasi on b.XBRLItem_ItemId equals (int)f.XBRLItem_ItemId
where (b.XBRLItem_ItemId == (int)f.XBRLItem_ItemId)
select new MappingDomainRepository
{
KI = f.Id,
Dimension = e.Name,
Domain = c.Id,
Description = d.Text,
XBRLItem_ItemId = a.XBRLItem_ItemId
};
...which adds in the XBRLItem_ItemId which use to join to the CTE.
Then join the two together. We have other (above) and KelompokInformasi from the CTE:
var result = from x in KelompokInformasi
join o in other on x.XBRLItem_ItemId equals o.XBRLItem_ItemId
select new {KelompokInformasi = o.KelompokInformasi,
DimensionName = o.Name,
Domain = o.Id,
Description = o.Text
};
..which appears to be the columns you exentually select.